#include "Estoque.h"

Estoque::Estoque()
{
	this->setCodigoCorrente( 0 );
}

Estoque::~Estoque()
{
}

/*--- inicio dos metodos publicos ---*/

bool Estoque::verificaSeHa(int vCodigoABuscar, int vQuantidadeAVerificar)
{
	noLista* pAuxiliar;
	if(mListaDeProdutos.get(&pAuxiliar, vCodigoABuscar))
	{
		if( pAuxiliar->quantidade >= vQuantidadeAVerificar )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}

bool Estoque::retiraDoEstoque( int vCodigoARetirar, int vQuantidadeARetirar )
{
	noLista* pAuxiliar;
	if( mListaDeProdutos.get( &pAuxiliar, vCodigoARetirar ) )
	{
		pAuxiliar->quantidade -= vQuantidadeARetirar;
		return true;
	}
	else
	{
		return false;
	}
}

void Estoque::inserirProduto( std::string vDescricao, float vValor )
{
	noLista* 
	no = new noLista;

	Produto*
	novoProduto;

	char tipo;
	
	do
	{
		//system("clear");
		std::cout << "Tipo(A/B/C) : ";
		std::cin >> tipo;
	
		switch( toupper( tipo ) )
		{
			case 'A':	novoProduto = new A( vValor, vDescricao, this->getCodigoCorrente() );
						break;
			case 'B':	novoProduto = new B( vValor, vDescricao, this->getCodigoCorrente() );
						break;
			case 'C':	novoProduto = new C( vValor, vDescricao, this->getCodigoCorrente() );
						break;
		}
	}while( toupper( tipo ) != 'A' && toupper( tipo ) != 'B' && toupper( tipo ) != 'C' );
	
	no->pProduto = novoProduto;

	this->mListaDeProdutos.inserir( no, no->pProduto->getCodigo() );
	
	std::cout << "Codigo do produto:" << no->pProduto->getCodigo();
	std::cout << std::endl << "Pressione algo para continuar!!!"; 
	
	std::cin >> tipo;
	
	this->incremetaCodigoCorrente();
	
}

bool Estoque::inserirQuantidadeProduto( int vCodigo, int vQuantidadeAInserir )
{
	if(vQuantidadeAInserir <= 0)
	{
		return false;
	}
	else
	{
		noLista* pAuxiliar;
		mListaDeProdutos.get( &pAuxiliar, vCodigo );
		pAuxiliar->quantidade += vQuantidadeAInserir;
		return true;
	}
}

void Estoque::setCodigoCorrente( int vCodigoCorrente )
{
	this->mCodigoCorrente = vCodigoCorrente;
}

int Estoque::getCodigoCorrente() const
{
	return this->mCodigoCorrente;
}

Produto* Estoque::getProduto( int vCodigo )
{
	noLista* pAuxiliar;
	mListaDeProdutos.get( &pAuxiliar,vCodigo );
	return pAuxiliar->pProduto;
}

void Estoque::mostraTodos()
{
	noLista**
	pAuxiliar;
	
	mListaDeProdutos.zeraPercorrendo();
	
	std::cout << "Codigo \t\t\t Quantidade" << std::endl; 
	while(!mListaDeProdutos.itsTheEnd())
	{
		pAuxiliar = mListaDeProdutos.retornaEsteEAvanca();
		std::cout 	<< (*pAuxiliar)->pProduto->getCodigo() 	<< "\t\t\t";
		std::cout   << (*pAuxiliar)->quantidade << std::endl;
	}
}

/*--- fim dos metodos publicos ---*/

/*--- inicio dos metods privados ---*/

void Estoque::incremetaCodigoCorrente()
{
	this->mCodigoCorrente++;
}

/*--- fim dos metodos privados ---*/



